from functools import reduce


def show(str):
    "打印参数"  # 函数的第一行默认可以是函数的说明
    print(str)


show('测试自定义函数')
# 可以指定参数传递值
show(str="成都理工大学")


# 调用函数时，如果没有传递参数，则会使用默认参数
def printinfo(name, age=35):
    "打印任何传入的字符串"
    print("名字: ", name)
    print("年龄: ", age)
    return


print("萍安")


# 加了*的参数会以元组(tuple)的形式导入，存放所有未命名的变量参数。不定长参数
def functionname(formal_args, *var_args_tuple):
    "函数_文档字符串"
    print(formal_args)
    print(var_args_tuple)


functionname(8, 90, 890)


# 还有一种就是参数带两个星号**，基本语法如下：加了两个星号**的参数会以字典的形式导入。
def functionname1(arg1, **var_args_dict):
    "函数_文档字符串"
    print(arg1)
    print(var_args_dict)


# 如果 Python 函数直接返回多个值，Python 会自动将多个返回值封装成元组。
def showlist():
    return 2, 4, 6  # 多值时，不指定类型


print(type(showlist()))
print(showlist())


# map() 会根据提供的函数对指定序列做映射。
# 第一个参数 function 以参数序列中的每一个元素调用 function 函数，返回包含每次 function 函数返回值的新列表。

def square(x):  # 计算平方数
    return x ** 2


list1 = list(map(square, [1, 2, 3, 4, 5]))  # 计算列表各个元素的平方
print('list1', list1)
list2 = list(map(lambda x: x ** 2, [1, 2, 3, 4, 5]))  # 使用lambda
print('list2', list2)


# reduce() 函数会对参数序列中元素进行累积
def add(x, y):  # 两数相加
    return x + y


sum1 = reduce(add, [1, 2, 3, 4, 5])  # 计算列表和：1+2+3+4+5
print('sum1', sum1)
sum2 = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])  # 使用lambda
print('sum2', sum2)